import axios from 'axios'
import userStore from '../store/userStore';
import getIP from './getIP'
import { sendMessageToParent, removeEmptyDeep } from './index'
import { notification } from 'antd';

let CustomIp = 'none'
let getIpCount = 0
const errorCode = {
  '401': '认证失败，无法访问系统资源',
  '403': '当前操作没有权限',
  '404': '访问资源不存在',
  'default': '系统未知错误，请反馈给管理员'
}


const handleLoginHint = (message) => {
  if (window.parent !== window) {
    // console.log('当前页面在 iframe 中');
    sendMessageToParent(403)
  } else {
    userStore.getState().actions.setLoginHint({
      title: '登录提示',
      content: message,
      show: true
    })
  }
}

// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀
  baseURL: import.meta.env.VITE_APP_BASE_API,
  // baseURL: 'https://aidex.setworld.net',
  timeout: 30 * 60000 // 请求超时时间
})

// 异常拦截处理器
const errorHandler = (error) => {
  console.log('request异常拦截处理器err' + error)
  let { message } = error
  if (message.indexOf('401') > -1) {
    message = 'token失效，请重新登录！'
    handleLoginHint(message)
  }
  if (message === 'Network Error') {
    message = '后端接口连接异常'
  } else if (message.includes('timeout')) {
    message = '系统接口请求超时'
  } else if (message.includes('Request failed with status code')) {
    message = '系统接口' + message.substr(message.length - 3) + '异常'
  }
  notification.error({
    message: message,
    duration: 5
  })
  return { message, code: error.status }
  //  return Promise.reject(error) //注释该行，否则接口请求失败会一直请求刷新错误数据，这里保证请求一次
}

// request interceptor
request.interceptors.request.use(async (config) => {
  const accessToken = userStore.getState().userToken;
  // 如果 token 存在
  // 让每个请求携带自定义 token 请根据实际情况自行修改
  if (accessToken) {
    if (config.url.includes(import.meta.env.VITE_APP_YYJC_API)) {
      config.headers['Authorization'] = 'Bearer ' + accessToken // 让每个请求携带自定义token 请根据实际情况自行修改
    } else {
      config.headers['Authorization'] = accessToken
    }
    config.headers['AccessToken'] = accessToken // 让每个请求携带自定义token 请根据实际情况自行修改
    // config.headers['accessAccess-Token'] = token
  }
  if (config.data) {
    config.data = removeEmptyDeep(config.data);
  }
  if (!getIpCount) {
    const res = await getIP()
    getIpCount++
    CustomIp = res || CustomIp
  }
  config.headers['CustomIp'] = CustomIp
  // get请求映射params参数
  if (config.method === 'get' && config.params) {
    let url = config.url + '?'
    for (const propName of Object.keys(config.params)) {
      const value = config.params[propName]
      var part = encodeURIComponent(propName) + '='
      // 修改漏洞
      if (value != null && typeof value !== 'undefined') {
        if (typeof value === 'object') {
          for (const key of Object.keys(value)) {
            const params = propName + '[' + key + ']'
            var subPart = encodeURIComponent(params) + '='
            url += subPart + encodeURIComponent(value[key]) + '&'
          }
        } else {
          url += part + encodeURIComponent(value) + '&'
        }
      }
    }
    url = url.slice(0, -1)
    config.params = {}
    config.url = url
  }
  return config
}, errorHandler)

// response interceptor
request.interceptors.response.use((res) => {
  // 请求rul
  const requestUrl = res.config.url
  // 未设置状态码则默认成功状态
  const code = res.data.code || 200
  // 获取错误信息
  const msg = errorCode[code] || res.data.message || res.data.msg || errorCode['default']
  if (code === 401 && !requestUrl.includes('/getInfo')) {
    handleLoginHint(msg)
  } else if (code === 500) {
    if (requestUrl !== '/login') {
      notification.error({
        message: msg,
        description: msg
      })
    }
  } else if (code !== 200) {
    notification.error({
      message: msg,
      duration: 5
    })
  } else {
    return res.data
  }
  // return Promise.reject(msg)
  return { message: msg, code }
}, errorHandler)


export default request

